# define _CRT_SECURE_NO_WARNINGS

//#include<iostream>
//#include<cstring>
//using namespace std;
//const int N = 100010;
//int h[N], e[N], ne[N], idx;
//int f[N];
//string str;
//
//void add(int a, int b)
//{
//    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
//}
//
//int dfs(int u)
//{
//    if (f[u] != -1) return f[u];
//    int ret = 0;
//
//    if (u != 1 && str[u - 1] == '1') ret++;
//
//    for (size_t i = h[u]; i != -1; i = ne[i])
//    {
//        int j = e[i];
//        ret += dfs(j);
//    }
//    return f[u] = ret;
//}
//
//int main()
//{
//    memset(f, -1, sizeof f);
//    memset(h, -1, sizeof h);
//    int n;
//    cin >> n;
//    cin >> str;
//    for (int i = 0; i < n - 1; i++)
//    {
//        int u, v;
//        scanf("%d%d", &u, &v);
//        add(u, v);
//    }
//
//    dfs(1);
//
//    for (int i = 1; i <= n; i++)
//        if (h[i] == -1) puts("0");
//        else printf("%d\n", f[i]);
//    return 0;
//}

#include<iostream>
#include<cstring>
using namespace std;
const int N = 100010;
int h[N], e[N], ne[N], idx;
int f[N];
string str;

void add(int a, int b)
{
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

int dfs(int u)
{
    if (h[u] == -1)
    {
        if (str[u - 1] == '1') return 1;
        else return 0;
    }

    int ret = 0;

    for (size_t i = h[u]; i != -1; i = ne[i])
    {
        int j = e[i];
        dfs(j);
        ret += dfs(j);
    }

    if (str[u - 1] == '1') return f[u] = ret + 1;
    else return f[u] = ret;
}

int main()
{
    memset(h, -1, sizeof h);
    int n;
    cin >> n;
    cin >> str;
    for (int i = 0; i < n - 1; i++)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        add(u, v);
    }

    dfs(1);

    for (int i = 1; i <= n; i++)
        printf("%d\n", f[i]);
    return 0;
}